package com.xxxtea.controller;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xxxtea.common.Result;
import com.xxxtea.dto.PageQuery;
import com.xxxtea.entity.Cart;
import com.xxxtea.entity.Dish;
import com.xxxtea.service.CartService;
import com.xxxtea.service.DishService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 购物车控制器
 *
 * 提供购物车的完整管理功能，包括：
 * - 购物车商品的增删改查
 * - 购物车数量统计与清空
 * - 分页与列表查询
 * - 购物车商品库存同步
 *
 * 使用Swagger注解进行API文档生成
 * 使用Lombok注解简化代码
 *
 * @author badman
 * @since 1.0.0
 */
@Slf4j
@Api("购物车接口")
@RestController
@RequestMapping("/cart")
public class CartController {
	/**
	 * 购物车服务
	 */
	@Resource
	private CartService cartService;
	
	/**
	 * 菜品服务
	 */
	@Resource
	private DishService dishService;

	/**
	 * 获取购物车商品数量
	 *
	 * @return 购物车商品总数
	 */
	@GetMapping("/count")
	@ApiOperation("获取购物车数量")
	public Result<Long> count() {
		return Result.success(cartService.count());
	}

	/**
	 * 清空购物车
	 * 可指定清空部分商品
	 *
	 * @param ids 要清空的购物车ID列表（可选）
	 * @return 操作结果
	 */
	@PostMapping("/clear")
	@ApiOperation("清空购物车")
	public Result<String> clear(@RequestBody(required = false) List<Integer> ids) {
		cartService.remove(new LambdaQueryWrapper<Cart>()
				.in(CollUtil.isNotEmpty(ids), Cart::getId, ids));
		return Result.success();
	}

	/**
	 * 新增购物车商品
	 * 若已存在则增加数量
	 *
	 * @param request 购物车商品信息
	 * @return 操作结果
	 */
	@PostMapping
	@ApiOperation("新增购物车")
	public Result<String> save(@RequestBody Cart request) {
		Cart cart = cartService.lambdaQuery()
				.eq(Cart::getBusinessId, request.getBusinessId())
				.eq(Cart::getBusinessType, request.getBusinessType())
				.one();
		// 若购物车已存在，添加相应的数量
		if (cart != null) {
			cart.setCount(cart.getCount() + request.getCount());
			cartService.updateById(cart);
			return Result.success();
		}
		if (!cartService.save(request)) {
			return Result.error("添加失败!");
		}
		return Result.success();
	}

	/**
	 * 删除购物车商品
	 *
	 * @param id 购物车ID
	 * @return 操作结果
	 */
	@DeleteMapping("/{id}")
	@ApiOperation("删除购物车")
	public Result<String> delete(@PathVariable String id) {
		if (!cartService.removeById(id)) {
			return Result.error("删除失败!");
		}
		return Result.success();
	}

	/**
	 * 更新购物车商品
	 *
	 * @param request 购物车商品信息
	 * @return 操作结果
	 */
	@PutMapping
	@ApiOperation("更新购物车")
	public Result<String> update(@RequestBody Cart request) {
		if (!cartService.updateById(request)) {
			return Result.error("更新失败!");
		}
		return Result.success();
	}

	/**
	 * 获取单个购物车商品
	 *
	 * @param id 购物车ID
	 * @return 购物车商品信息
	 */
	@GetMapping("/{id}")
	@ApiOperation("获取单个购物车")
	public Result<Cart> getOne(@PathVariable String id) {
		return Result.success(cartService.getById(id));
	}

	/**
	 * 获取购物车商品列表
	 * 支持按业务类型筛选，并同步商品库存
	 *
	 * @param request 查询条件
	 * @return 购物车商品列表
	 */
	@GetMapping("/list")
	@ApiOperation("获取购物车列表")
	public Result<List<Cart>> list(Cart request) {
		LambdaQueryWrapper<Cart> wrapper = new LambdaQueryWrapper<>(request);
		wrapper.orderByDesc(Cart::getId);
		wrapper.eq(Cart::getBusinessType, request.getBusinessType());
		List<Cart> cartList = cartService.getBaseMapper().listBusiness(wrapper);
		if (request.getBusinessType() == Cart.BusinessType.DISH) {
			// 查询购物车对应菜品的库存
			Set<Integer> dishIds = cartList.stream().map(Cart::getBusinessId).collect(Collectors.toSet());
			Map<Integer, Integer> stockMap = dishService.listByIds(dishIds).stream().collect(Collectors.toMap(Dish::getId, Dish::getStock));
			for (Cart cart : cartList) {
				cart.setStock(stockMap.get(cart.getBusinessId()));
			}
		}
		return Result.success(cartList);
	}

	/**
	 * 分页查询购物车商品
	 *
	 * @param request 分页查询条件
	 * @return 分页购物车商品列表
	 */
	@PostMapping("/page")
	@ApiOperation("分页查询购物车")
	public Result<Page<Cart>> page(@RequestBody PageQuery<Cart> request) {
		// 分页查询
		LambdaQueryWrapper<Cart> wrapper = new LambdaQueryWrapper<>(request.getParam());
		Page<Cart> pageResult = cartService.page(request.toPage(), wrapper);
		return Result.success(pageResult);
	}
}
